//
// Created by Administrator on 2021/10/21.
//

#ifndef MRENDER_BUFFERGEOMETRY_H
#define MRENDER_BUFFERGEOMETRY_H

#include <map>
#include "Material.h"
#include "IRenderable.h"

class BufferGeometry : public Object, public IRenderable, public IDrawUIable{
private:
    /**
     * 创建VAO,VBO,EBO
     * @param location attribute 的 location
     * @param attrib 属性
     * @param data 数据
     */
    void setUpAttributeBuffer(GLuint location, const ShaderAttribute &attrib, std::vector<float> data);

public:
    String type;
    /**
     * 增长id
     */
    int id;
    /**
     * 唯一标识id
     */
    String uuid;
    /**
     * 名称
     */
    String name;

public:
    /**
     * 内置顶点集合
     */
    std::vector<float> vertices;
    /**
     * 顶点索引
     */
    std::vector<int> indices;
    /**
     * 内置顶点颜色集合，创建几何体后初始化到默认颜色
     */
    std::vector<float> colors;

    /**
     * 内置顶点UV集合
     */
    std::vector<float> uvs;

    /**
       * 内置顶点法线集合
       */
    std::vector<float> normals;

    /**
     * 是否索引绘制
     */
    bool bDrawIndices;

    /**
     * 绘制数量，如果没有索引，返回顶点数量；如果使用索引，返回索引数量
     */
    int drawCount;

    /**
     * Shader的 attribute 数据类型 Buffer 存储
     */
    std::map<GLuint, ShaderAttribBuffer*> shaderAttribBufferMap;

    /**
     * 几何体应用材质
     */
    Material * p_material;

public:
    /**
     * 渲染模式
     */
    GLint drawMode;

    /**
     * 多边形渲染模式，默认填充，可选 点、线...
     */
    GLint polygonMode;

    /**
     * 应用材质
     * @param p_material 材质
     */
    void setMaterial(Material *p_material);

public:
    void onInit() override;
    void onRender(float elapsedTime, Matrix4x4 proj, Matrix4x4 view, Matrix4x4 pworld) override;
    void drawUI() override;
public:
    BufferGeometry();
    ~BufferGeometry();

    /**
     * 给attribute赋值
     * @param attrib attri属性
     * @param data 数组值
     */
    void setUpAttribute(const ShaderAttribute& attrib, std::vector<float> data);
};


#endif //MRENDER_BUFFERGEOMETRY_H
